經過前兩天的介紹,相信大家對 Apache DataFusion 已經有了基本認識。今天我們要進入快樂的實作階段,嘗試建立一個 rust 小專案並透過 DataFusion 查詢不同格式的資料。
目前 DataFusion 最新的穩定版本 49.0.2 要求 Rust 1.85.1 或更新版本::
# 安裝 Rust(所有平台通用)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source ~/.bashrc # Linux/macOS
# 驗證安裝
rustc --version # 應顯示 1.85.1+
Windows 使用者請下載 rustup-init.exe 安裝。
透過 cargo 建立專案 datafusion-demo
,進入該專案後新增存放資料用的目錄 data
cargo new datafusion-demo
cd datafusion-demo
mkdir data
什麼是 Cargo?
Cargo 是 Rust 的專案管理工具,類似於 Python 的 pip 或 Node.js 的 npm。它會幫我們管理相依套件、編譯程式碼等工作。
在 Cargo.toml
中設定專案的基本資訊和本次實作需要的相依套件:
[package]
name = "datafusion-demo"
version = "0.1.0"
edition = "2024"
[dependencies]
datafusion = "50.0.0"
tokio = { version = "1.0", features = ["rt-multi-thread", "macros"] }
在 data
中新增學生成績資料的 csv 檔案。
(data/students.csv
):
name,age,subject,score,semester
張小明,20,數學,85,2024春
李小華,21,數學,92,2024春
王小美,19,英文,78,2024春
陳小強,22,英文,88,2024春
張小明,20,英文,82,2024春
李小華,21,物理,90,2024春
王小美,19,數學,75,2024春
陳小強,22,數學,95,2024春
我們將程式分成幾個部分解釋。
在 src/main.rs
中改寫 main function:
use datafusion::prelude::*;
#[tokio::main]
async fn main() -> datafusion::error::Result<()> {
// 建立 SessionContext
let ctx = SessionContext::new();
// 依序加入2-3 的程式碼
Ok(())
}
其中:
#[tokio::main]
讓我們可以使用 async/await 非同步的方式進行後面 I/O 的操作SessionContext::new()
建立查詢環境,類似資料庫連線使用先前創建的 SessionContext 註冊 csv 檔案
// 註冊 CSV 檔案 - 並命名為 "students_csv"
ctx.register_csv("students_csv", "data/students.csv", CsvReadOptions::new()).await?;
其中:
register_xxx()
將 CSV/JSON 檔案註冊為可查詢的表格,註冊後就可以用 SQL 語法查詢,就像查詢資料庫表格一樣.await?
表示等待操作完成,如果有錯誤就停止程式註冊完成後,便可以透過 SQL 語法查詢該 csv 檔了,這次我們來計算這些學生的平均成績吧~
println!("\n📊 CSV 格式查詢:每位學生平均分數");
let csv_query = ctx.sql("
SELECT name, AVG(score) as avg_score
FROM students_csv
GROUP BY name
ORDER BY avg_score DESC
").await?;
csv_query.show().await?;
其中:
ctx.sql()
創建一個執行 query 計畫GROUP BY name
按姓名分組ORDER BY avg_score DESC
按平均分數降序排列.show()
執行查詢並顯示查詢結果到這邊程式已經大功告成啦! 最後我們只需要執行程式:
cargo run
成功後就可以看到查詢的結果了
+--------+-----------+
| name | avg_score |
+--------+-----------+
| 陳小強 | 91.5 |
| 李小華 | 91.0 |
| 張小明 | 83.5 |
| 王小美 | 76.5 |
+--------+-----------+
從上面的實作中可以發現我們只要透過 DataFusion 註冊數據來源 (csv 檔) 後,便可以使用 SQL 語法輕鬆的查詢或計算這些檔案的資訊,查詢引擎是不是很方便呀~
明天我們將繼續探討 SessionContext 的內部機制並認識 DataFusion 提供的兩大類型 API,敬請期待!